#include <string.h>
#include "Protocol.h"

const char* ImProtocol::SERVER_IP = "192.168.1.112";    // 服务器 IP 地址
const char* ImProtocol::MULTI_CHAT = ("群发消息");      // 群发消息标志

/**
 * 协议的构造方法。
 * @param type  协议类型
 */
ImProtocol::ImProtocol(Type type) :
    mType(type) {
}

/**
 * 协议的析构方法。
 */
ImProtocol::~ImProtocol() {
}

/**
 * 用户信息的构造方法。
 */
UserInfo::UserInfo() :
    mIconIndex(0) {
    memset(mUsername, 0, sizeof(mUsername));
    memset(mPassword, 0, sizeof(mPassword));
}

/**
 * 用户信息的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
UserInfo::UserInfo(int iconIndex, const char* password, const char* username) :
    mIconIndex(iconIndex) {
    if (password != nullptr) {
        strcpy_s(mPassword, ImProtocol::PASSWORD_BUF_LEN, password);
    } else {
        memset(mPassword, 0, sizeof(mPassword));
    }
    strcpy_s(mUsername, ImProtocol::USERNAME_BUF_LEN, username);
}

/**
 * 添加好友请求的构造方法。
 * @param dstUsername   目标用户名
 * @param srcIconIndex  源用户头像索引
 * @param srcUsername   源用户名
 */
AddFriendRequest::AddFriendRequest(const char* dstUsername, int srcIconIndex, const char* srcUsername) :
    ImProtocol(ImProtocol::ADD_FRIEND_REQUEST),
    mIconIndex(srcIconIndex) {
    strcpy_s(mDstUsername, USERNAME_BUF_LEN, dstUsername);
    strcpy_s(mSrcUsername, USERNAME_BUF_LEN, srcUsername);
}

/**
 * 添加好友结果的构造方法。
 * @param dstIconIndex  目标用户头像索引
 * @param dstUsername   目标用户名
 * @param resultCode    结果码
 * @param srcUsername   源用户名
 */
AddFriendResult::AddFriendResult(int dstIconIndex, const char* dstUsername, ResultCode resultCode, const char* srcUsername) :
    ImProtocol(ADD_FRIEND_RESULT),
    mDstIconIndex(dstIconIndex),
    mResultCode(resultCode) {
    strcpy_s(mDstUsername, ImProtocol::USERNAME_BUF_LEN, dstUsername);
    if (srcUsername != nullptr) {
        strcpy_s(mSrcUsername, ImProtocol::USERNAME_BUF_LEN, srcUsername);
    }
}

/**
 * 聊天信息的构造方法。
 * @param content     内容
 * @param dstUsername 目标用户名
 * @param srcUsername 源用户名
 * @param time        生成时间
 */
ChatInfo::ChatInfo(const char* content, const char* dstUsername, const char* srcUsername, const char* time) :
    ImProtocol(ImProtocol::CHAT) {
    strcpy_s(mContent, ImProtocol::CONTENT_BUF_LEN, content);
    strcpy_s(mDstUsername, ImProtocol::USERNAME_BUF_LEN, dstUsername);
    strcpy_s(mSrcUsername, ImProtocol::USERNAME_BUF_LEN, srcUsername);
    strcpy_s(mTime, ImProtocol::DATE_TIME_BUF_LEN, time);
}

/**
 * 好友登录通知的构造方法。
 * @param username  用户名
 */
FriendLogon::FriendLogon(const char* username) :
    ImProtocol(ImProtocol::FRIEND_LOGON) {
    strcpy_s(mUsername, ImProtocol::USERNAME_BUF_LEN, username);
}

/**
 * 离线请求的构造方法。
 * @param username  用户名
 */
LogoffRequest::LogoffRequest(const char* username) :
    ImProtocol(ImProtocol::LOGOFF) {
    strcpy_s(mUsername, ImProtocol::USERNAME_BUF_LEN, username);
}

/**
 * 登录请求的构造方法。
 * @param password  密码
 * @param username  用户名
 */
LogonRequest::LogonRequest(const char* password, const char* username) :
    ImProtocol(LOGON),
    mUserInfo(0, password, username) {
}

/**
 * 登录结果的构造方法。
 */
LogonResult::LogonResult() :
    ImProtocol(LOGON),
    mFriendCount(0),
    mIconIndex(-1),
    mResultCode(SUCCEEDED) {
    memset(mFriends, 0, sizeof(mFriends));
    memset(mFriendsOnline, 0, sizeof(mFriendsOnline));
}

/**
 * 注册请求的构造方法。
 * @param iconIndex 头像索引
 * @param password  密码
 * @param username  用户名
 */
RegRequest::RegRequest(int iconIndex, const char* password, const char* username) :
    ImProtocol(REG),
    mUserInfo(iconIndex, password, username) {
}

/**
 * 注册结果的构造方法。
 */
RegResult::RegResult() :
    ImProtocol(REG),
    mResultCode(SUCCEEDED) {
}
